#ifndef GAME_H_
#define GAME_H_

#include "utypes.h"
#include "compat.h"
#include "player.h"
#include "music.h"
#include "rtc.h"

/** @struct Word
 *  @brief Struct Word
 *
 * Struct responsável pela criação de uma variável do tipo Word.
 * Esta vai conter uma palavra-chave e uma dica para esta palavra-chave */
typedef struct SecretWord
{
	char  word [16];
	char tip [60];
} SecretWord;



/** Função que gera uma palavra e uma dica aleatoriamente.
 * @return um apontador para uma Word.
 * @param dictionary Dicionário de palavra e dicas.
 */
SecretWord generate_string( SecretWord * dictionary );

/** Função que verifica se a letra está ou não na palavra.
  * @return true se a palavra conter a letra caso contrário retorna false
  * @param word  Palavra
  * @param letter Letra
  * @param letter_found Letras Encontradas
  */
int find_letter (char * word  , char letter , char * letter_found);

/** Função que actualiza a palavra quando o jogador acerta numa letra.
 *  @param x_pos posição no eixo dos x
 *  @param y_pos posição no eixo dos y
 *  @param fore_color color da palavra
 *  @param back_color cor de fundo (à volta da palavra)
 *  @param char_scale tamanho caracteres
 *  @param video_base apontador para memória de endereços
 *  @param table apontador para tabela ASCII
 *  @param word	apontador para palavra-chave
 *  @param letter letra adivinhada
 */
void update_word (int x_pos, int y_pos, int fore_color, int back_color, int char_scale, char* video_base, char* table, char * word , char letter);

/** Função que desenha os traços correspondentes ao número de letras da palavra.x
 *  @param x_pos posição no eixo dos x
 *  @param y_pos posição no eixo dos y
 *  @param color cor
 *  @param base apontador para memória de endereços
 *  @param word	apontador para palavra-chave
 */
void draw_traces (int x_pos, int y_pos, int color, char * base, char * word);

/** Função que desenha a forca.
 *  @param x_pos posição no eixo dos x
 *  @param y_pos posição no eixo dos y
 *  @param color cor
 *  @param base apontador para memória de endereços
 */
void draw_gallow (int x_pos, int y_pos, int color, char * base);

/** Função que desenha a parte do enforcado relativamente ao numero do erro (num_errors = 1 -> cabeça | num_erros = 2 -> tronco ....)
 *  @param x_pos posição no eixo dos x
 *  @param y_pos posição no eixo dos y
 *  @param color cor
 *  @param base apontador para memória de endereços
 *  @param num_errors número de erros
 */
void draw_Hangman ( int x_pos , int y_pos, int color, char * base , int num_errors );

/** Função que calcula a pontuação do jogador no jogo
 *  @param num_errors número de erros
 *  @param num_letters número de letras da palavra
 */
int calculate_score (int num_errors, int num_letters);

/** Função que actualiza o array de melhores pontuações
 *  @param best_players array com os jogadores com as melhores pontuações
 *  @param player jogador a ser inserido no array dos melhores
 */
void update_best_scores(Player ** best_players , Player* player);

/** Função que imprime o array de melhores pontuações
 *  @param best_players array com os jogadores com as melhores pontuações
 */
void print_best_scores (Player ** best_players ,  char *video_base, char *table);

/** Desenha o alfabeto
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
*/
void drawAlpahabet( char *video_base, char *table );

/** Função do motor de jogador único
* @param letters_used array das letras usadas
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
*/
void updateAlphabet( char * letters_used , char *video_base, char *table );

/** Função do motor de jogador único
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
* @param best_player Tabela das melhores pontuações
*/
void play_single( char *video_base, char *table , Player ** best_players );


/** Função cliente do modo dois jogadores
* @param base Porta Série
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
* @param best_player Tabela das melhores pontuações
*/
void play_client(Word base ,  char *video_base, char *table , Player ** best_players );

/** Função servidor do modo dois jogadores
* @param base Porta Série
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
* @param best_player Tabela das melhores pontuações
*/
void play_server( Word base , char *video_base, char *table , Player ** best_players );

/** Função do servidor de sincronização
* @param base Porta Série
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
*/
Bool sync_server( Word base , char *video_base, char *table);

/** Função cliente de sincronização
* @param base Porta Série
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
*/
Bool sync_client(Word base ,  char *video_base, char *table);

/** Mostra o manual
* @param video_base endereço de memória vídeo
* @param table tabela com os caracteres ASCII
*/
void showManual( char *video_base, char *table);

#endif /* GAME_H_ */
